package gui;

import generatorWektorow.GeneratorWektorow;

import javax.swing.SwingUtilities;
import java.awt.BorderLayout;
import javax.swing.JPanel;
import javax.swing.JFrame;
import java.awt.Dimension;
import javax.swing.JProgressBar;
import java.awt.GridBagLayout;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JButton;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

import java.awt.GridBagConstraints;
import java.awt.Rectangle;
import javax.swing.JCheckBox;
import javax.swing.BorderFactory;
import javax.swing.UIManager.LookAndFeelInfo;
import javax.swing.border.TitledBorder;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

import java.awt.Font;
import java.awt.Color;
import javax.swing.JLabel;
import javax.swing.JTextField;

import KNN.FabrykaMetryk;
import javax.swing.SwingConstants;
import javax.swing.JComboBox;

public class FrameMain extends JFrame {

	private static final long serialVersionUID = 1L;
	private JPanel jContentPane = null;
	private JProgressBar barPostep = null;
	private JPanel panelSterowanie = null;
	private JScrollPane scrollLog = null;
	private JTextArea textLog = null;
	private JButton buttonStart = null;
	private JCheckBox checkGenerowanieWektorow = null;
	private JCheckBox checkKlasyfikacjaWektorow = null;
	private JPanel panelCechy = null;
	private JLabel labelStan = null;
	private JTextField textLiczbaSasiadow = null;
	private JLabel labelLiczbaSasiadow = null;
	private JCheckBox checkKrzyweZamkniete = null;
	private JCheckBox checkLuki = null;
	private JCheckBox checkCiezkoscSrodka = null;
	private JCheckBox checkSzerokoscGory = null;
	private JLabel labelSkutecznosc = null;
	
	//=========================================
	private GuiLogger log = new GuiLogger();  //  @jve:decl-index=0:
	private ObslugaRozpoznawania obslugaRozpoznawania;  //  @jve:decl-index=0:
	private JLabel labelMetryka = null;
	private JComboBox comboBoxMetryka = null;
	private boolean pracuje = false;
	private JCheckBox checkNormalizacja = null;
	//=========================================
	/**
	 * This method initializes barPostep	
	 * 	
	 * @return javax.swing.JProgressBar	
	 */
	public JProgressBar getBarPostep() {
		if (barPostep == null) {
			barPostep = new JProgressBar();
			barPostep.setPreferredSize(new Dimension(148, 30));
		}
		return barPostep;
	}
	
	public JLabel getLabelSkutecznosc(){
		return labelSkutecznosc;
	}

	/**
	 * This method initializes panelSterowanie	
	 * 	
	 * @return javax.swing.JPanel	
	 */
	private JPanel getPanelSterowanie() {
		if (panelSterowanie == null) {
			labelMetryka = new JLabel();
			labelMetryka.setBounds(new Rectangle(8, 224, 113, 17));
			labelMetryka.setText("Rodzaj metryki:");
			labelSkutecznosc = new JLabel();
			labelSkutecznosc.setBounds(new Rectangle(103, 336, 90, 25));
			labelSkutecznosc.setFont(new Font("Dialog", Font.BOLD, 12));
			labelSkutecznosc.setForeground(Color.black);
			labelSkutecznosc.setHorizontalTextPosition(SwingConstants.RIGHT);
			labelSkutecznosc.setHorizontalAlignment(SwingConstants.RIGHT);
			labelSkutecznosc.setText("0 %");
			labelSkutecznosc.setText("");
			labelLiczbaSasiadow = new JLabel();
			labelLiczbaSasiadow.setBounds(new Rectangle(8, 200, 110, 16));
			labelLiczbaSasiadow.setText("Liczba sasiadow: ");
			labelStan = new JLabel();
			labelStan.setBounds(new Rectangle(8, 336, 89, 25));
			labelStan.setText("Skutecznosc: ");
			panelSterowanie = new JPanel();
			panelSterowanie.setLayout(null);
			panelSterowanie.setPreferredSize(new Dimension(200, 200));
			panelSterowanie.add(getButtonStart(), null);
			panelSterowanie.add(getPanelCechy(), null);
			panelSterowanie.add(getCheckKlasyfikacjaWektorow(), null);
			panelSterowanie.add(getCheckGenerowanieWektorow(), null);
			panelSterowanie.add(labelStan, null);
			panelSterowanie.add(getTextLiczbaSasiadow(), null);
			panelSterowanie.add(labelLiczbaSasiadow, null);
			panelSterowanie.add(labelSkutecznosc, null);
			panelSterowanie.add(labelMetryka, null);
			panelSterowanie.add(getComboBoxMetryka(), null);
			panelSterowanie.add(getCheckNormalizacja(), null);
		}
		return panelSterowanie;
	}

	/**
	 * This method initializes scrollLog	
	 * 	
	 * @return javax.swing.JScrollPane	
	 */
	private JScrollPane getScrollLog() {
		if (scrollLog == null) {
			scrollLog = new JScrollPane();
			scrollLog.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
			scrollLog.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
			scrollLog.setViewportView(getTextLog());
		}
		return scrollLog;
	}

	/**
	 * This method initializes textLog	
	 * 	
	 * @return javax.swing.JTextArea	
	 */
	private JTextArea getTextLog() {
		if (textLog == null) {
			textLog = new JTextArea();
			textLog.setWrapStyleWord(true);
			textLog.setEditable(false);
			textLog.setLineWrap(true);
		}
		return textLog;
	}

	/**
	 * This method initializes buttonStart	
	 * 	
	 * @return javax.swing.JButton	
	 */
	private JButton getButtonStart() {
		if (buttonStart == null) {
			buttonStart = new JButton();
			buttonStart.setText("Start");
			buttonStart.setBounds(new Rectangle(8, 304, 186, 26));
			buttonStart.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {
					if(!pracuje){
						//etykieta start
						pracuje = true;
						KNN.KNN.PRZERWIJ = false;
						GeneratorWektorow.PRZERWIJ = false;
						buttonStart.setText("Stop");
						setNewObslugaRozpoznawania();
						log.reset();
						obslugaRozpoznawania.execute();
					}else {
						zakonczPrace();
					}
				}
			});
		}
		return buttonStart;
	}
	
	public void zakonczPrace() {
		//etykieta stop
		pracuje = false;
		KNN.KNN.PRZERWIJ = true;
		GeneratorWektorow.PRZERWIJ = true;
		//obslugaRozpoznawania.cancel(true);
		buttonStart.setText("Start");
		odblokujKontrolki();
	}

	/**
	 * This method initializes checkGenerowanieWektorow	
	 * 	
	 * @return javax.swing.JCheckBox	
	 */
	public JCheckBox getCheckGenerowanieWektorow() {
		if (checkGenerowanieWektorow == null) {
			checkGenerowanieWektorow = new JCheckBox();
			checkGenerowanieWektorow.setActionCommand("");
			checkGenerowanieWektorow.setBounds(new Rectangle(8, 8, 177, 21));
			checkGenerowanieWektorow.setBounds(new Rectangle(8, 8, 173, 21));
			checkGenerowanieWektorow.setSelected(false);
			checkGenerowanieWektorow.setText("Generowanie wektorow");
			checkGenerowanieWektorow.addChangeListener(new ChangeListener(){

				@Override
				public void stateChanged(ChangeEvent e) {
					
					JCheckBox checkBox = (JCheckBox) e.getSource();
					if(!checkBox.isSelected()){
						checkCiezkoscSrodka.setEnabled(false);
						checkKrzyweZamkniete.setEnabled(false);
						checkLuki.setEnabled(false);
						checkSzerokoscGory.setEnabled(false);
					}else {
						checkCiezkoscSrodka.setEnabled(true);
						checkKrzyweZamkniete.setEnabled(true);
						checkLuki.setEnabled(true);
						checkSzerokoscGory.setEnabled(true);
					}
				}
				
			});
		}
		return checkGenerowanieWektorow;
	}

	/**
	 * This method initializes checkKlasyfikacjaWektorow	
	 * 	
	 * @return javax.swing.JCheckBox	
	 */
	public JCheckBox getCheckKlasyfikacjaWektorow() {
		if (checkKlasyfikacjaWektorow == null) {
			checkKlasyfikacjaWektorow = new JCheckBox();
			checkKlasyfikacjaWektorow.setText("Klasyfikacja wektorow");
			checkKlasyfikacjaWektorow.setBounds(new Rectangle(8, 32, 173, 21));
			checkKlasyfikacjaWektorow.setSelected(true);
			checkKlasyfikacjaWektorow.setBounds(new Rectangle(8, 32, 163, 21));
			checkKlasyfikacjaWektorow.addChangeListener(new ChangeListener(){

				@Override
				public void stateChanged(ChangeEvent e) {
					
					JCheckBox checkBox = (JCheckBox) e.getSource();
					if(!checkBox.isSelected()){
						textLiczbaSasiadow.setEnabled(false);
						checkNormalizacja.setEnabled(false);
						comboBoxMetryka.setEnabled(false);
					}else {
						textLiczbaSasiadow.setEnabled(true);
						checkNormalizacja.setEnabled(true);
						comboBoxMetryka.setEnabled(true);
					}
				}
				
			});
		}
		return checkKlasyfikacjaWektorow;
	}

	/**
	 * This method initializes panelCechy	
	 * 	
	 * @return javax.swing.JPanel	
	 */
	private JPanel getPanelCechy() {
		if (panelCechy == null) {
			panelCechy = new JPanel();
			panelCechy.setLayout(null);
			panelCechy.setBorder(BorderFactory.createTitledBorder(null, "Cechy", TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION, new Font("Dialog", Font.BOLD, 12), new Color(51, 51, 51)));
			panelCechy.setBounds(new Rectangle(8, 56, 185, 139));
			panelCechy.add(getCheckKrzyweZamkniete(), null);
			panelCechy.add(getCheckLuki(), null);
			panelCechy.add(getCheckCiezkoscSrodka(), null);
			panelCechy.add(getCheckSzerokoscGory(), null);
		}
		return panelCechy;
	}

	/**
	 * This method initializes textLiczbaSasiadow	
	 * 	
	 * @return javax.swing.JTextField	
	 */
	public JTextField getTextLiczbaSasiadow() {
		if (textLiczbaSasiadow == null) {
			textLiczbaSasiadow = new JTextField();
			textLiczbaSasiadow.setBounds(new Rectangle(128, 200, 65, 24));
			textLiczbaSasiadow.setHorizontalAlignment(JTextField.RIGHT);
			textLiczbaSasiadow.setText("10");
		}
		return textLiczbaSasiadow;
	}

	/**
	 * This method initializes checkKrzyweZamkniete	
	 * 	
	 * @return javax.swing.JCheckBox	
	 */
	public JCheckBox getCheckKrzyweZamkniete() {
		if (checkKrzyweZamkniete == null) {
			checkKrzyweZamkniete = new JCheckBox();
			checkKrzyweZamkniete.setText("Krzywe zamkniete");
			checkKrzyweZamkniete.setSelected(true);
			checkKrzyweZamkniete.setEnabled(false);
			checkKrzyweZamkniete.setBounds(new Rectangle(16, 24, 137, 24));
		}
		return checkKrzyweZamkniete;
	}

	/**
	 * This method initializes checkLuki	
	 * 	
	 * @return javax.swing.JCheckBox	
	 */
	public JCheckBox getCheckLuki() {
		if (checkLuki == null) {
			checkLuki = new JCheckBox();
			checkLuki.setText("Luki");
			checkLuki.setSelected(true);
			checkLuki.setEnabled(false);
			checkLuki.setBounds(new Rectangle(16, 48, 137, 24));
		}
		return checkLuki;
	}

	/**
	 * This method initializes checkCiezkoscSrodka	
	 * 	
	 * @return javax.swing.JCheckBox	
	 */
	public JCheckBox getCheckCiezkoscSrodka() {
		if (checkCiezkoscSrodka == null) {
			checkCiezkoscSrodka = new JCheckBox();
			checkCiezkoscSrodka.setBounds(new Rectangle(16, 72, 137, 21));
			checkCiezkoscSrodka.setSelected(true);
			checkCiezkoscSrodka.setEnabled(false);
			checkCiezkoscSrodka.setText("Ciezkosc srodka");
		}
		return checkCiezkoscSrodka;
	}

	/**
	 * This method initializes checkSzerokoscGory	
	 * 	
	 * @return javax.swing.JCheckBox	
	 */
	public JCheckBox getCheckSzerokoscGory() {
		if (checkSzerokoscGory == null) {
			checkSzerokoscGory = new JCheckBox();
			checkSzerokoscGory.setBounds(new Rectangle(16, 96, 145, 21));
			checkSzerokoscGory.setSelected(true);
			checkSzerokoscGory.setEnabled(false);
			checkSzerokoscGory.setText("Szerokosc gory");
		}
		return checkSzerokoscGory;
	}

	/**
	 * This method initializes comboBoxMetryka	
	 * 	
	 * @return javax.swing.JComboBox	
	 */
	public JComboBox getComboBoxMetryka() {
		if (comboBoxMetryka == null) {
			comboBoxMetryka = new JComboBox();
			comboBoxMetryka.setBounds(new Rectangle(8, 248, 185, 25));
			comboBoxMetryka.addItem(FabrykaMetryk.wezMetryke(FabrykaMetryk.EUKLIDESOWA));
			comboBoxMetryka.addItem(FabrykaMetryk.wezMetryke(FabrykaMetryk.CZEBYSZEWA));
			comboBoxMetryka.addItem(FabrykaMetryk.wezMetryke(FabrykaMetryk.ULICZNA));
			comboBoxMetryka.setSelectedIndex(0);
		}
		return comboBoxMetryka;
	}

	/**
	 * This method initializes checkNormalizacja	
	 * 	
	 * @return javax.swing.JCheckBox	
	 */
	public JCheckBox getCheckNormalizacja() {
		if (checkNormalizacja == null) {
			checkNormalizacja = new JCheckBox();
			checkNormalizacja.setBounds(new Rectangle(8, 280, 185, 21));
			checkNormalizacja.setText("Normalizuj wektory cech");
		}
		return checkNormalizacja;
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				FrameMain thisClass = new FrameMain();
				thisClass.setNewObslugaRozpoznawania();
				thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
				thisClass.setVisible(true);
			}
		});
	}

	/**
	 * This is the default constructor
	 */
	public FrameMain() {
		super();
		try {
		    for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
		        if ("Nimbus".equals(info.getName())) {
		            UIManager.setLookAndFeel(info.getClassName());
		            break;
		        }
		    }
		} catch (UnsupportedLookAndFeelException e) {
			//TODO dodac obsluge wyjatkow
		} catch (ClassNotFoundException e) {
			
		} catch (InstantiationException e) {
		    
		} catch (IllegalAccessException e) {
		    
		}
  		SwingUtilities.updateComponentTreeUI(this);
		initialize();
		log.ustawKontrolkeEtykiety(labelSkutecznosc);
		log.ustawKontrolkePostepu(barPostep);
		log.ustawKontrolkeTekstowa(textLog);
	}

	/**
	 * This method initializes this
	 * 
	 * @return void
	 */
	private void initialize() {
		this.setSize(737, 443);
		this.setContentPane(getJContentPane());
		this.setTitle("JFrame");
	}

	/**
	 * This method initializes jContentPane
	 * 
	 * @return javax.swing.JPanel
	 */
	private JPanel getJContentPane() {
		if (jContentPane == null) {
			jContentPane = new JPanel();
			jContentPane.setLayout(new BorderLayout());
			jContentPane.add(getBarPostep(), BorderLayout.SOUTH);
			jContentPane.add(getPanelSterowanie(), BorderLayout.WEST);
			jContentPane.add(getScrollLog(), BorderLayout.CENTER);
		}
		return jContentPane;
	}
	
	public ObslugaRozpoznawania getObslugaRozpoznawania(){
		if(obslugaRozpoznawania == null){
			obslugaRozpoznawania= new ObslugaRozpoznawania();
		}
		return obslugaRozpoznawania;
	}
	
	public void setNewObslugaRozpoznawania(){
			obslugaRozpoznawania= new ObslugaRozpoznawania();
			obslugaRozpoznawania.setFrameMain(this);
	}
	
	public GuiLogger getLogger(){
		return log;
	}
	
	public void zablokujKontrolki(){
		checkCiezkoscSrodka.setEnabled(false);
		checkGenerowanieWektorow.setEnabled(false);
		checkKlasyfikacjaWektorow.setEnabled(false);
		checkKrzyweZamkniete.setEnabled(false);
		checkLuki.setEnabled(false);
		checkSzerokoscGory.setEnabled(false);
		textLiczbaSasiadow.setEnabled(false);
		checkNormalizacja.setEnabled(false);
		comboBoxMetryka.setEnabled(false);
	}
	
	public void odblokujKontrolki(){
		checkGenerowanieWektorow.setEnabled(true);
		checkKlasyfikacjaWektorow.setEnabled(true);
		
		if(checkKlasyfikacjaWektorow.isSelected()){
			textLiczbaSasiadow.setEnabled(true);
			checkNormalizacja.setEnabled(true);
			comboBoxMetryka.setEnabled(true);
		}
		
		if(checkGenerowanieWektorow.isSelected()){
			checkCiezkoscSrodka.setEnabled(true);
			checkKrzyweZamkniete.setEnabled(true);
			checkLuki.setEnabled(true);
			checkSzerokoscGory.setEnabled(true);
		}
		

	}

}  //  @jve:decl-index=0:visual-constraint="10,10"
